//
//  main.cpp
//  C++入门
//
//  Created by 卜绎皓 on 2022/7/30.
//

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;
//namespace byh
//{
//    // 命名空间中可以定义变量/函数/类型
//    int rand = 10;
//    int Add(int left, int right)
//        {
//            return left + right;
//        }
//    struct Node
//        {
//            struct Node* next;
//            int val;
//        };
//}
////2. 命名空间可以嵌套
//namespace N1
//    {
//        int a = 20;
//        int b;
//        int Add(int left, int right)
//            {
//                return left + right;
//            }
//        namespace N2
//            {
//                int c;
//                int d;
//                int Sub(int left, int right)
//                    {
//                        return left - right;
//                    }
//            }
//    }
////3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
//namespace N1
//    {
//        int Mul(int left, int right)
//            {
//                return left * right;
//            }
//    }




//int rand = 10;//变量和函数重名
// C语言没办法解决类似这样的命名冲突问题，所以C++提出了namespace来解决
//int main()
//{
//    printf("%d\n",byh :: rand);//rand是函数，编译会报错
//    return 0;
//}

//using N1::a;
//using namespace byh;
//int main()
//{
//    int c = 1;
//    int d = 2;
//    printf("%d\n",byh::rand);
//    printf("%d\n",a);
//    printf("%d\n",Add(c, d));
//    return 0;
//}

//std是C++标准库的命名空间名，C++将标准库的定义实现都放到这个命名空间中
//using namespace std;
//
//int main()
//{
//    int a = 1;
//    float b = 2.1;
//    double c= 2.111;
//    char arr[10] = { 0 };
//    char d[] = "hello world";
//    cin >> arr;
//    cout << arr << endl;//endl相当于换行 -> /n
//    cout << a << endl;//C++的输入输出可以自动识别变量类型
//    cout << b << endl;
//    cout << c << endl;
//    cout << d << endl;
//    return 0;
//}

//using namespace std;
//
//int Add(int x, int y)
//{
//    return x + y;
//}
//
//double Add(double x, double y)
//{
//    return x + y;
//}
//int main()
//{
//    cout << Add(0,1) << endl;//打印0+1的结果
//    cout << Add(1.1,2.2) << endl;//打印1.1+2.2的结果
//    return 0;
//}
//
//short Add(short left, short right)
//{
//    return left+right;
//}
//int Add(short left, short right)
//{
//    return left+right;
//}

//#include<iostream>
//using namespace std;
//
//int main()
//{
//    int a = 1;
//    int&b = a; //相当于给a起了一个别名为b，int是b的类型
//    cout << a << endl;
//    cout << b << endl;
//    b = 100;  //改变b也就相当于改变了a
//    cout << b << endl;
//    cout << a << endl;
//}

//void TestRef()
//{
//    int a = 10;
//    int& ra; // 该条语句编译时会出错
//    int& ra = a;
//    int& rra = a;
//    printf("%p %p %p\n", &a, &ra, &rra);
//}

//void TestConstRef()
//{
//    //常引用是创建一个临时变量，引用名是临时变量的引用
//    const int a = 10;
//    //int& ra = a; // 该语句编译时会出错，a为常量,而且a为不可以修改
//    const int& ra = a;
//    // int& b = 10; // 该语句编译时会出错，b为常量
//    const int& b = 10;
//    double d = 12.34;
//    //int& rd = d; // 该语句编译时会出错，类型不同
//    const int& rd = d;
//}


//#include<iostream>
//using namespace std;
//int main()
//{
//    int a = 10;
//    //double&ra = a;
//
//
//
//    const double&ra = a;
//}
//
//void Swap2(int& a, int& b) //通过引用来交换
//{
//    int tmp = a;
//    a = b;
//    b = tmp;
//}
//void Swap1(int* a, int *b) //通过指针来交换
//{
//    int tmp = *a;
//    *a = *b;
//    *b = tmp;
//}

//using namespace std;
//int& Add(int a, int b)
//{
//    static int c = a + b;
//    return c;
//}
//int main()
//{
//    int& ret = Add(1, 2);
//    Add(3, 4);
//    cout << "Add(1, 2) is :"<< ret <<endl;
//    return 0;
//}

//int main()
//{
//     int a = 10;
//     int& ra = a;
//     cout<<"&a = "<<&a<<endl;
//     cout<<"&ra = "<<&ra<<endl;
//     return 0;
//
//}

//int main()
//{
//     int a = 10;
//
//     int& ra = a;
//     ra = 20;
//
//     int* pa = &a;
//     *pa = 20;
//
//     return 0;
//
//}

//#include<iostream>
//using namespace std;


//int TestAuto()
//{
//    return 10;
//}
//int main()
//{
//    int a = 10;
//    auto b = a;
//    auto c = 'a';
//    auto d = TestAuto();
//
//    cout << typeid(b).name() << endl; //这个地方要学到后面类的时候才可以解释，这里打印出的是类型名
//    cout << typeid(c).name() << endl;
//    cout << typeid(d).name() << endl;
//
//    cout << a << endl;
//    cout << b<< endl;
//    cout << c << endl;
//    cout << d << endl;
//
//    //auto e; 无法通过编译，使用auto定义变量时必须对其进行初始化
//    return 0;
//}
//
////void TestAuto()
////{
//// auto a = 1, b = 2;
//// auto c = 3, d = 4.0; // 该行代码会编译失败，因为c和d的初始化表达式类型不同
////}
//
//// 此处代码编译失败，auto不能作为形参类型，因为编译器无法对a的实际类型进行推导
////void TestAuto(auto a)
////{}
//
//void TestAuto()
//{
//    int a[] = {1,2,3};
//    auto b[] = {4，5，6};
//}

//void TestFor()
//{
//     int array[] = { 1, 2, 3, 4, 5 };
//     //将数组所有元素乘以2
//     for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
//         array[i] *= 2;
//
//     for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
//         cout << *p << endl;
//
//}

//void TestFor()
//{
//     int array[] = { 1, 2, 3, 4, 5 };
//     //将数组中所有元素乘以2
//     for(auto& e : array)//记得是需要写出auto&
//         e *= 2;
//
//     for(auto e : array)
//         cout << e << " ";
//
//     return ;
// }
//
//int main()
//{
//    TestFor();
//}

//void TestFor(int array[])
//{
//     for(auto& e : array)  //这里的array其实不是数组，数组在传参时会退化成指针
//     cout<< e <<endl;
//}

//#include <iostream>
//using namespace std;
//void Fun(int p)
//{
//    cout << "Fun(int)" << endl;
//}
//void Fun(int* p)
//{
//    cout << "Fun(int*)" << endl;
//}
//int main()
//{
//    Fun(0);           //打印结果为 Fun(int)
//    Fun(NULL);        //打印结果为 Fun(int)
//    Fun((int*)NULL);  //打印结果为 Fun(int*)
//    return 0;
//}








